// 导入express模块
const express = require('express')
// 创建express的服务器实例
const app = express()
// 导入 cors 中间件 解决跨域
const cors = require('cors')

const joi = require('joi')

// 这个是最后压缩dist文件静态托管网络请求大小
const compression = require('compression')

// 导入配置文件
const config = require('./config')

// 解析 token 的中间件
const expressJWT = require('express-jwt')

// 一定要把这一行代码，写到静态资源托管之前
app.use(compression())
app.use(express.static('./dist'))

/*
// 配置解析 `application/x-www-form-urlencoded` 格式的表单数据的中间件：
app.use(express.urlencoded({ extended: false })) 未知原因，无法解析到req.body内容
*/

// ----1.导入解决req.body请求对象后台接收到为空值引入body-parser--------
// 先安装npm install body-parser -save
//引入中间件  
const bodyParser = require('body-parser')
// --------------------------------------------------------------------

// --------2.导入解决req.body请求对象后台接收到为空值 使用该中间件 ----------
// 请求体解析中间件
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({ extended: false }))
// 返回的对象是一个键值对，当extended为false的时候，键值对中的值就为'String'或'Array'形式，为true的时候，则可为任何数据类型。
// -----------------------------------------------------------------------

// 使用 .unless({ path: [/^\/api\//] }) 指定哪些接口不需要进行 Token 的身份认证
app.use(expressJWT({ secret: config.jwtSecretKey }).unless({ path: [/^\/api\//] }))

// 将 cors 注册为全局中间件
app.use(cors())



// 响应数据的中间件
app.use(function (req, res, next) {
  // status = 0 为成功； status = 1 为失败； 默认将 status 的值设置为 1，方便处理失败的情况
  res.cc = function (err, status = 1) {
    res.send({
      // 状态
      status,
      // 状态描述，判断 err 是 错误对象 还是 字符串
      message: err instanceof Error ? err.message : err,
    })
  }
  next()
})

// 导入并注册用户路由模块
const userRouter = require('./router/user')
app.use('/api', userRouter)
// 导入并使用用户信息路由模块
const userinfoRouter = require('./router/userinfo')
app.use('/my', userinfoRouter)
// 导入老年人票价信息路由模块
const orderRouter = require('./router/order')
app.use('/my', orderRouter)
// 导入职工表信息路由模块
const employeeRouter = require('./router/employee')
app.use('/my', employeeRouter)

// 错误中间件
app.use(function (err, req, res, next) {
  // 数据验证失败
  if (err instanceof joi.ValidationError) return res.cc(err)
  // 捕获身份认证失败的错误
  if (err.name === 'UnauthorizedError') return res.cc('身份认证失败！')
  // 未知错误
  res.cc(err)
})


// 调用app.listen 方法，指定端口号并且启动web服务器
app.listen(3001,() =>{
  console.log('sale_system server run at http://127.0.0.1:3001')
})